﻿/*
 *       This file is part of VFC.
 *
 *        VFC is free software: you can redistribute it and/or modify
 *        it under the terms of the GNU General Public License as published by
 *        the Free Software Foundation, either version 3 of the License, or
 *        (at your option) any later version.
 *
 *        VFC is distributed in the hope that it will be useful,
 *        but WITHOUT ANY WARRANTY; without even the implied warranty of
 *        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *        GNU General Public License for more details.
 *
 *        You should have received a copy of the GNU General Public License
 *        along with VFC.  If not, see <http://www.gnu.org/licenses/>.
 */


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
//using System.Linq;
using System.Text;
using System.Windows.Forms;
using VFC.Debug;
using VFC.Emu;

namespace VFC
{
    public partial class frmDebug : Form
    {
        private static int tmp = 0;
        private static int pTmp = 0;

        private static Font bfont = new Font("Courier New", 8, FontStyle.Bold);
        private static Font font = new Font("Courier New", 8, FontStyle.Regular);

        CustomListView clView = new CustomListView();

        public frmDebug()
        {
            InitializeComponent();

        }

        private void frmDebug_Load(object sender, EventArgs e)
        {
            GroupDisassembly.Controls.Add(clView);
            clView.View = View.Details;
            clView.GridLines = true;
            clView.Dock = DockStyle.Fill;

            clView.Columns.Add("Address");
            clView.Columns.Add("Opcode");
            clView.Columns.Add("Assembly");

            clView.Columns[0].Width = 70;     //Address width
            clView.Columns[1].Width = 90;     //Opcode width
            clView.Columns[2].Width = 230;    //Assembly width

            clView.GridLines = true;
            clView.MultiSelect = true;

            Debug.Debugger.Decompile(clView, Nes.Cpu.Register.PC);
            Debug.Debugger.Update(Debug.Debugger._X_, txtX);
            Debug.Debugger.Update(Debug.Debugger._Y_, txtY);
            Debug.Debugger.Update(Debug.Debugger._A_, txtA);
            Debug.Debugger.Update(Debug.Debugger._PC_, txtPC);
            Debug.Debugger.Update(Debug.Debugger._SR_, txtSR);
            Debug.Debugger.Update(Debug.Debugger._SP_, txtSP);

            Debug.Debugger.Update(Debug.Debugger._CPU_CYCLE_, txtCpuCycle);
            Debug.Debugger.Update(Debug.Debugger._PPU_CYCLE_, txtPpuCycle);
            Debug.Debugger.Update(Debug.Debugger._SCANLINE_, txtScanline);

            Debug.Debugger.Update(Debug.Debugger._2000_, txt2000);
            Debug.Debugger.Update(Debug.Debugger._2001_, txt2001);
            Debug.Debugger.Update(Debug.Debugger._2002_, txt2002);
            Debug.Debugger.Update(Debug.Debugger._2003_, txt2003);
            Debug.Debugger.Update(Debug.Debugger._2004_, txt2004);
            Debug.Debugger.Update(Debug.Debugger._2005_, txt2005);
            Debug.Debugger.Update(Debug.Debugger._2006_, txt2006);
            Debug.Debugger.Update(Debug.Debugger._2007_, txt2007);
        }

        private void CmdRefresh_Click(object sender, EventArgs e)
        {
            clView.Items.Clear();
            Debug.Debugger.Decompile(clView, Nes.Cpu.Register.PC);
            Debug.Debugger.Update(Debug.Debugger._X_, txtX);
            Debug.Debugger.Update(Debug.Debugger._Y_, txtY);
            Debug.Debugger.Update(Debug.Debugger._A_, txtA);
            Debug.Debugger.Update(Debug.Debugger._PC_, txtPC);
            Debug.Debugger.Update(Debug.Debugger._SR_, txtSR);
            Debug.Debugger.Update(Debug.Debugger._SP_, txtSP);

            Debug.Debugger.Update(Debug.Debugger._CPU_CYCLE_, txtCpuCycle);
            Debug.Debugger.Update(Debug.Debugger._PPU_CYCLE_, txtPpuCycle);
            Debug.Debugger.Update(Debug.Debugger._SCANLINE_, txtScanline);

            Debug.Debugger.Update(Debug.Debugger._2000_, txt2000);
            Debug.Debugger.Update(Debug.Debugger._2001_, txt2001);
            Debug.Debugger.Update(Debug.Debugger._2002_, txt2002);
            Debug.Debugger.Update(Debug.Debugger._2003_, txt2003);
            Debug.Debugger.Update(Debug.Debugger._2004_, txt2004);
            Debug.Debugger.Update(Debug.Debugger._2005_, txt2005);
            Debug.Debugger.Update(Debug.Debugger._2006_, txt2006);
            Debug.Debugger.Update(Debug.Debugger._2007_, txt2007);
        }

        private void CmdStep_Click(object sender, EventArgs e)
        {
            Emu.EmuCore.Step();
            tmp = Emu.Misc.AddressExist(clView, Nes.Cpu.Register.PC.ToString("X2"));
            if (tmp < 100)
            {
                if (!clView.Items[pTmp].BackColor.Equals(Color.White))
                {
                    clView.Items[pTmp].BackColor = Color.White;
                }
                pTmp = tmp;
                clView.Items[pTmp].BackColor = Color.LightGray;
            }
            else
            {
                clView.Items.Clear();
                Debug.Debugger.Decompile(clView, Nes.Cpu.Register.PC);
            }
            Debug.Debugger.Update(Debug.Debugger._X_, txtX);
            Debug.Debugger.Update(Debug.Debugger._Y_, txtY);
            Debug.Debugger.Update(Debug.Debugger._A_, txtA);
            Debug.Debugger.Update(Debug.Debugger._PC_, txtPC);
            Debug.Debugger.Update(Debug.Debugger._SR_, txtSR);
            Debug.Debugger.Update(Debug.Debugger._SP_, txtSP);

            Debug.Debugger.Update(Debug.Debugger._CPU_CYCLE_, txtCpuCycle);
            Debug.Debugger.Update(Debug.Debugger._PPU_CYCLE_, txtPpuCycle);
            Debug.Debugger.Update(Debug.Debugger._SCANLINE_, txtScanline);

            Debug.Debugger.Update(Debug.Debugger._2000_, txt2000);
            Debug.Debugger.Update(Debug.Debugger._2001_, txt2001);
            Debug.Debugger.Update(Debug.Debugger._2002_, txt2002);
            Debug.Debugger.Update(Debug.Debugger._2003_, txt2003);
            Debug.Debugger.Update(Debug.Debugger._2004_, txt2004);
            Debug.Debugger.Update(Debug.Debugger._2005_, txt2005);
            Debug.Debugger.Update(Debug.Debugger._2006_, txt2006);
            Debug.Debugger.Update(Debug.Debugger._2007_, txt2007);
        }
    }
}
